home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / comm2 / termsorc.lha / Extras / Source / gtlayout-source.lha / LTP_LevelGadget.c < prev    next >
C/C++ Source or Header  |  1995-09-24  |  7KB  |  318 lines

  1. /*  GadTools layout toolkit
  2. **
  3. **  Copyright © 1993-1995 by Olaf `Olsen' Barthel
  4. **  Freely distributable.
  5. */
  6.  
  7. #include "gtlayout_global.h"
  8.  
  9. #ifdef DO_LEVEL_KIND
  10. VOID __regargs
  11. LTP_LevelGadgetDrawLabel(struct Gadget *Gadget,BOOL FullRefresh)
  12. {
  13.     LevelExtra    *Special = (LevelExtra *)Gadget -> SpecialInfo;
  14.     LONG         Current;
  15.     ObjectNode    *Node = (ObjectNode *)Gadget -> UserData;
  16.  
  17.     GetAttr(LVIA_Current,Special -> LevelImage,(ULONG *)&Current);
  18.  
  19.     Current += Special -> Plus;
  20.  
  21.     Special -> Level = Current;
  22.  
  23.     if(Node -> Label)
  24.     {
  25.         struct RastPort *RPort = &Special -> Handle -> RPort;
  26.         LayoutHandle    *Handle = Special -> Handle;
  27.         WORD             LabelTop,LabelLeft;
  28.  
  29.         switch(Special -> LevelPlace)
  30.         {
  31.             case PLACETEXT_LEFT:
  32.  
  33.                 LabelLeft    = Node -> Left - INTERWIDTH;
  34.                 LabelTop    = Node -> Top + (Node -> Height - Handle -> RPort . TxHeight) / 2;
  35.                 break;
  36.  
  37.             case PLACETEXT_RIGHT:
  38.  
  39.                 LabelLeft    = Node -> Left + Node -> Width + INTERWIDTH + Special -> MaxLevelWidth;
  40.                 LabelTop    = Node -> Top + (Node -> Height - Handle -> RPort . TxHeight) / 2;
  41.                 break;
  42.  
  43.             case PLACETEXT_ABOVE:
  44.  
  45.                 LabelLeft    = Node -> Left + (Node -> Width - Special -> MaxLevelWidth) / 2 + Special -> MaxLevelWidth;
  46.                 LabelTop    = Node -> Top - (Handle -> RPort . TxHeight + INTERHEIGHT);
  47.                 break;
  48.  
  49.             case PLACETEXT_BELOW:
  50.  
  51.                 LabelLeft    = Node -> Left + (Node -> Width - Special -> MaxLevelWidth) / 2 + Special -> MaxLevelWidth;
  52.                 LabelTop    = Node -> Top + Node -> Height + INTERHEIGHT;
  53.                 break;
  54.         }
  55.  
  56.         LTP_SetPens(RPort,Handle -> TextPen,Handle -> BackgroundPen,JAM2);
  57.  
  58.         if(FullRefresh)
  59.             LTP_DrawObjectLabel(Handle,Node);
  60.  
  61.         if(Special -> LevelFormat)
  62.         {
  63.             UBYTE    Buffer[256];
  64.             WORD    LevelWidth,
  65.                 LevelLen;
  66.  
  67.             if(Special -> DispFunc)
  68.                 Current = (*Special -> DispFunc)(Gadget,Current);
  69.  
  70.             sprintf(Buffer,Special -> LevelFormat,Current);
  71.  
  72.             LevelLen = strlen(Buffer);
  73.  
  74.             LevelWidth = TextLength(RPort,Buffer,LevelLen);
  75.  
  76.             Move(RPort,LabelLeft - LevelWidth,LabelTop + RPort -> TxBaseline);
  77.             Text(RPort,Buffer,LevelLen);
  78.  
  79.             if(LevelWidth < Special -> MaxLevelWidth)
  80.             {
  81.                 LTP_SetAPen(RPort,Handle -> BackgroundPen);
  82.                 RectFill(RPort,    LabelLeft - (Special -> MaxLevelWidth),    LabelTop,
  83.                                 LabelLeft - (LevelWidth + 1),            LabelTop + RPort -> TxHeight - 1);
  84.             }
  85.         }
  86.     }
  87. }
  88.  
  89.  
  90. /*****************************************************************************/
  91.  
  92.  
  93. ULONG __regargs
  94. LTP_LevelGadgetRender(struct Gadget *Gadget,struct gpRender *RenderMsg)
  95. {
  96.     LevelExtra *Special = (LevelExtra *)Gadget -> SpecialInfo;
  97.  
  98.     DrawImageState(RenderMsg -> gpr_RPort,Special -> LevelImage,Gadget -> LeftEdge,Gadget -> TopEdge,Gadget -> Flags & GFLG_DISABLED ? IDS_DISABLED : IDS_NORMAL,Special -> Handle -> DrawInfo);
  99.  
  100.     LTP_LevelGadgetDrawLabel(Gadget,TRUE);
  101.  
  102.     return(TRUE);
  103. }
  104.  
  105.  
  106. /*****************************************************************************/
  107.  
  108.  
  109. ULONG __regargs
  110. LTP_LevelGadgetGoActive(struct Gadget *Gadget,struct gpInput *InputMsg)
  111. {
  112.     LevelExtra        *Special = Gadget -> SpecialInfo;
  113.     LONG             Left;
  114.     ULONG             Position,
  115.                      KnobWidth,
  116.                      Current,
  117.                      Max;
  118.     struct RastPort *RPort;
  119.  
  120.     GetAttr(LVIA_Position,    Special -> LevelImage,&Position);
  121.     GetAttr(LVIA_Current,    Special -> LevelImage,&Current);
  122.     GetAttr(LVIA_KnobWidth, Special -> LevelImage,&KnobWidth);
  123.     GetAttr(LVIA_Max,        Special -> LevelImage,&Max);
  124.  
  125.     Left = InputMsg -> gpi_Mouse . X;
  126.  
  127.     if(Left < Position)
  128.     {
  129.         if(Current > 0)
  130.         {
  131.             SetAttrs(Special -> LevelImage,LVIA_Current,Current - 1,TAG_DONE);
  132.  
  133.             if(RPort = ObtainGIRPort(InputMsg -> gpi_GInfo))
  134.             {
  135.                 DrawImageState(RPort,Special -> LevelImage,Gadget -> LeftEdge,Gadget -> TopEdge,IDS_NORMAL,Special -> Handle -> DrawInfo);
  136.  
  137.                 ReleaseGIRPort(RPort);
  138.             }
  139.  
  140.             LTP_LevelGadgetDrawLabel(Gadget,FALSE);
  141.         }
  142.  
  143.         *InputMsg -> gpi_Termination = FALSE;
  144.  
  145.         return(GMR_NOREUSE | GMR_VERIFY);
  146.     }
  147.  
  148.     if(Left > KnobWidth + Position + KnobWidth)
  149.     {
  150.         if(Current < Max)
  151.         {
  152.             SetAttrs(Special -> LevelImage,LVIA_Current,Current + 1,TAG_DONE);
  153.  
  154.             if(RPort = ObtainGIRPort(InputMsg -> gpi_GInfo))
  155.             {
  156.                 DrawImageState(RPort,Special -> LevelImage,Gadget -> LeftEdge,Gadget -> TopEdge,IDS_NORMAL,Special -> Handle -> DrawInfo);
  157.  
  158.                 ReleaseGIRPort(RPort);
  159.             }
  160.  
  161.             LTP_LevelGadgetDrawLabel(Gadget,FALSE);
  162.         }
  163.  
  164.         *InputMsg -> gpi_Termination = FALSE;
  165.  
  166.         return(GMR_NOREUSE | GMR_VERIFY);
  167.     }
  168.  
  169.     Special -> MidOffset = KnobWidth + Position - Left;
  170.  
  171.     if(RPort = ObtainGIRPort(InputMsg -> gpi_GInfo))
  172.     {
  173.         DrawImageState(RPort,Special -> LevelImage,Gadget -> LeftEdge,Gadget -> TopEdge,IDS_SELECTED,Special -> Handle -> DrawInfo);
  174.  
  175.         ReleaseGIRPort(RPort);
  176.     }
  177.  
  178.     return(GMR_MEACTIVE);
  179. }
  180.  
  181.  
  182. /*****************************************************************************/
  183.  
  184.  
  185. ULONG __regargs
  186. LTP_LevelGadgetHandleInput(struct Gadget *Gadget,struct gpInput *InputMsg)
  187. {
  188.     if(InputMsg -> gpi_IEvent -> ie_Class == IECLASS_RAWMOUSE)
  189.     {
  190.         LevelExtra        *Special = Gadget -> SpecialInfo;
  191.         LONG             Left,Width;
  192.         ULONG             KnobWidth,
  193.                          Position,
  194.                          Current,
  195.                          Max,
  196.                          Result;
  197.         struct RastPort *RPort;
  198.         BOOL             DrawIt;
  199.  
  200.         GetAttr(LVIA_Position,    Special -> LevelImage,&Position);
  201.         GetAttr(LVIA_KnobWidth, Special -> LevelImage,&KnobWidth);
  202.         GetAttr(LVIA_Max,        Special -> LevelImage,&Max);
  203.  
  204.         Left = InputMsg -> gpi_Mouse . X + Special -> MidOffset - KnobWidth;
  205.  
  206.         Width = Special -> LevelImage -> Width - 2 * KnobWidth;
  207.  
  208.         if(InputMsg -> gpi_IEvent -> ie_Code == SELECTUP)
  209.         {
  210.             *InputMsg -> gpi_Termination = FALSE;
  211.  
  212.             Result = GMR_NOREUSE | GMR_VERIFY;
  213.         }
  214.         else
  215.             Result = 0;
  216.  
  217.         if(Left < 0)
  218.             Left = 0;
  219.         else
  220.         {
  221.             if(Left > Width)
  222.                 Left = Width;
  223.         }
  224.  
  225. //        Current = (Left * Max + Width - 1) / Width;
  226.  
  227.         if(Max)
  228.         {
  229.             Current = (Left * Max + (Width / (Max * 2))) / Width;
  230.  
  231.             if(Current > Max)
  232.                 Current = Max;
  233.             else
  234.             {
  235.                 if(Current < 0)
  236.                     Current = 0;
  237.             }
  238.         }
  239.         else
  240.             Current = 0;
  241.  
  242.         SetAttrs(Special -> LevelImage,LVIA_Current,Current,TAG_DONE);
  243.  
  244.         if(Result)
  245.             DrawIt = TRUE;
  246.         else
  247.         {
  248.             if(Position != Left && Max)
  249.             {
  250.                 DrawIt = TRUE;
  251.  
  252.                 SetAttrs(Special -> LevelImage,
  253.                     LVIA_Position,    Left,
  254.                 TAG_DONE);
  255.             }
  256.             else
  257.                 DrawIt = FALSE;
  258.         }
  259.  
  260.         if(DrawIt)
  261.         {
  262.             if(RPort = ObtainGIRPort(InputMsg -> gpi_GInfo))
  263.             {
  264.                 DrawImageState(RPort,Special -> LevelImage,Gadget -> LeftEdge,Gadget -> TopEdge,Result ? IDS_NORMAL : IDS_SELECTED,Special -> Handle -> DrawInfo);
  265.  
  266.                 ReleaseGIRPort(RPort);
  267.             }
  268.  
  269.             LTP_LevelGadgetDrawLabel(Gadget,FALSE);
  270.         }
  271.  
  272.         return(Result);
  273.     }
  274.     else
  275.         return(0);
  276. }
  277.  
  278.  
  279. /*****************************************************************************/
  280.  
  281.  
  282. ULONG __saveds __asm
  283. LTP_LevelGadgetDispatcher(register __a0 struct Hook *Hook,register __a2 struct Gadget *Gadget,register __a1 Msg msg)
  284. {
  285.     ULONG Result;
  286.  
  287.     switch(msg -> MethodID)
  288.     {
  289.         case GM_HITTEST:
  290.  
  291.             Result = GMR_GADGETHIT;
  292.             break;
  293.  
  294.         case GM_RENDER:
  295.  
  296.             Result = LTP_LevelGadgetRender(Gadget,(struct gpRender *)msg);
  297.             break;
  298.  
  299.         case GM_GOACTIVE:
  300.  
  301.             Result = LTP_LevelGadgetGoActive(Gadget,(struct gpInput *)msg);
  302.             break;
  303.  
  304.         case GM_HANDLEINPUT:
  305.  
  306.             Result = LTP_LevelGadgetHandleInput(Gadget,(struct gpInput *)msg);
  307.             break;
  308.  
  309.         default:
  310.  
  311.             Result = 0;
  312.             break;
  313.     }
  314.  
  315.     return(Result);
  316. }
  317. #endif /* DO_LEVEL_KIND */
  318.